//
// Created by deanw on 2025/6/22.
//

#ifndef IMAGE_SCENE_H
#define IMAGE_SCENE_H

#include <QGraphicsScene>

class ImageScene : public QGraphicsScene {
    Q_OBJECT
public:
    enum Axis { X, Y };

    Q_SIGNAL void doubleClicked(const QPointF& pos);
    Q_SIGNAL void dpiChanged(Axis);

    explicit ImageScene(QObject* parent = nullptr);
    // 设置图片
    bool setImage(const QImage& image, const QPointF& topLeft);
    // 设置DPI(每英寸的像素数)
    void setDPI(qreal dpi, Axis axis);
    // 设置每毫米的像素数
    void setDPM(qreal pixelsPerMM, Axis axis);
    // 获取DPI
    [[nodiscard]] qreal dpi(Axis axis) const;
    // 获取图片尺寸
    [[nodiscard]] QSizeF physicalSize() const;
    // 在物理坐标处添加标注
    void addPhysicalMarker(const QPointF& physPos, const QString& label);

    // 像素坐标转物理坐标
    [[nodiscard]] QPointF pixelToPhysical(const QPoint& pixel) const
    {
        return { pixelsToMM(pixel.x(), X), pixelsToMM(pixel.y(), Y) };
    }

    // 物理坐标转像素坐标
    [[nodiscard]] QPoint physicalToPixel(const QPointF& physical) const
    {
        return { mmToPixels(physical.x(), X), mmToPixels(physical.y(), Y) };
    }

    // 像素转毫米
    [[nodiscard]] qreal pixelsToMM(const int pixels, const Axis axis) const
    {
        const auto dpi = axis == X ? m_dpiX : m_dpiY;
        return pixels * (25.4 / dpi); // 25.4mm = 1英寸
    }

    // 毫米转像素
    [[nodiscard]] int mmToPixels(const qreal mm, const Axis axis) const
    {
        const auto dpi = axis == X ? m_dpiX : m_dpiY;
        return qRound(mm * (dpi / 25.4));
    }

protected:
    void mouseDoubleClickEvent(QGraphicsSceneMouseEvent* event) override;

private:
    qreal m_dpiX = 25 * 25.4; // 海康相机的默认 DPI
    qreal m_dpiY = 25 * 25.4;
};

#endif // IMAGE_SCENE_H
